#ifndef SYNTREE_H
#define SYNTREE_H

typedef struct
{
	// Index de la table des symboles
	int index;
	char* id;
}
id_node;

typedef struct
{
	// Nom d'identifiant
	char* str;
}
id_str_node;

typedef struct
{
	// Type de variable
	int type;
}
type_node;

typedef struct
{
	// Contenu
	char* str;
	char* label;
}
str_node;

typedef struct 
{
	int debut;
	int fin;
}
range_node;

typedef struct 
{
	int type;
	int debutTab;
	int finTab;
	int nbDim;
}
arr_node;

typedef struct
{
	// Valeur
	int value;
}
int_node;

typedef struct
{
	// Valeur
	int value;
}
bool_node;

typedef struct
{
	int opr;  // Opérateur
	int nop;  // Nombre d'opérandes
	// Opérandes (tableau de noeuds)
	struct syn_tree** op;  
}
op_node;

typedef struct syn_tree
{
	// Type du noeud de l'arbre
	int type;
	
	// Contenu du noeud
	union
	{
		// Variable
		id_node id;
		id_str_node id_str;
		// Type d'une variable
		type_node _type;
		// Constantes
		str_node   string;   // Chaîne de caractères
		arr_node   array;    // Tableau
		range_node range;
		int_node   integer;  // Entier
		bool_node  boolean;  // Booléen
		// Opérations
		op_node op;
	};
}
syntree;

#include "global.h"

syntree* syntree_node(void);
syntree* _id(char* id);
syntree* _id_str(char* str);
syntree* _type(int type);
syntree* _str(char* str);
syntree* _range(int debut, int fin);
syntree* _type_array(syntree* rangelist, int type);
syntree* _int(int value);
syntree* _bool(int value);
syntree* _op(int op, int nop, ...);
void syntree_free(syntree* tree);

#endif

